<?php

require_once 'Basic.php';

class ChoicesNotAnArrayException extends Exception {
  public function __construct($message = "", $code = 0, $previous = null) {
    parent::__construct($message, $code, $previous);
  }
}

class FormFieldChoice extends FormFieldType {

  private $choices;
  
  /**
   * Note que, mesmo que o array de opções pode ter chaves que não são strings, o input passado ao validate será sempre
   * uma string. Ele é referente a alguma chave do array de opções, mas como ele é basicamente o que veio da entrada
   * do usuário, ele é passado como uma string.
   * 
   * @param type $choices O array de opções. Essas são as opções que devem ser dadas ao usuário. As chaves desse array
   * são usadas como valor de cada elemento option do html que será gerado. O valor associado a cada chave no array
   * é usado como conteúdo da tag option.
   * 
   * @throws ChoicesNotAnArrayException Quando $choices não é um array.
   */
  public function __construct($choices) {
    if(gettype($choices) !== "array") {
      throw new ChoicesNotAnArrayException(gettype($choices));
    }
    $this->choices = $choices;
    $this->htmlId = null;
    $this->htmlClass = "choicesField";
    $this->inputSize = 1;
  }

  public function clearHtmlClass() {
    $this->htmlClass = "choicesField";
  }

  /**
   * 
   * @param type $name O nome do elemento select.
   * @param type $value O campo selecionado.
   * @return string O Html como um select/option.
   */
  public function getHtml($name, $value) {
    $out = "<select " . $this->commonAttributes() . " name='${name}'>";
    foreach($this->choices as $k=>$v) {
      $sel = "";
      if(strval($k) === strval($value)) {
        $sel = "selected='selected'";
      }
      $out .= "<option ${sel} value='${k}'>" . $v . "</option>";
    }
    $out .= "</select>";
    return $out;
  }

  public function validate($input) {
    foreach($this->choices as $key => $value) {
      if($input === strval($key)) {
        return true;
      }
    }
    return "Escolha inv&aacute;lida.";
  }
  
}
